package exttable.formgenerator;

import javax.swing.table.AbstractTableModel;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


/**
 * Created by IntelliJ IDEA.
 * User: ADMIN
 * Date: 21.04.2010
 * Time: 9:05:26
 * To change this template use File | Settings | File Templates.
 */
public class DatabaseTableModel extends AbstractTableModel {
    // здесь мы будем хранить названия столбцов
    private ArrayList<String> columnNames = new ArrayList<String>();
    // список типов столбцов
    private ArrayList<Class> columnTypes = new ArrayList<Class>();
    // хранилище для полученных данных из базы данных
    private ArrayList<ArrayList> data = new ArrayList<ArrayList>();

    private boolean editable;
    private Map<String, String[]> map = new HashMap();

    // конструктор позволяет задать возможность редактирования
    public DatabaseTableModel(boolean editable) {
        this.editable = editable;
    }

    // данные в ячейке
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        synchronized (data) {
            return (data.get(rowIndex)).get(columnIndex);
        }
    }

    // количество столбцов
    @Override
    public int getColumnCount() {
        return columnNames.size();
    }

    // количество строк
    @Override
    public int getRowCount() {
        synchronized (data) {
            return data.size();
        }
    }

    // тип данных столбца
    @Override
    public Class getColumnClass(int columnIndex) {
        return columnTypes.get(columnIndex);
    }

    // название столбца
    @Override
    public String getColumnName(int columnIndex) {
        return columnNames.get(columnIndex);
    }

    // возможность редактирования
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return editable;
    }

    // замена значения ячейки
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        synchronized (data) {
            (data.get(rowIndex)).set(columnIndex, value);
        }
    }

    // получение данных из объекта ResultSet
    public void setDataSource(ResultSet rs, String tableName, Connection conn) throws Exception {
// удаляем прежние данные
        data.clear();
        columnNames.clear();
        columnTypes.clear();

// получаем вспомогательную информацию о столбцах
        ResultSetMetaData rsmd = rs.getMetaData();
        int columnCount = rsmd.getColumnCount();
        for (int i = 0; i < columnCount; i++) {
// название столбца
//            columnNames.add(rsmd.getColumnName(i + 1));
            columnNames.add(TranslateFields.getTranslateOfColumnOrOfTable("additional_columns","column_name",rsmd.getColumnName(i + 1), conn));
// тип столбца
            Class type = Class.forName(rsmd.getColumnClassName(i + 1));
            //System.out.println("ColumnName  = "+rsmd.getColumnName(i + 1)+"  type  = "+type);
            columnTypes.add(type);
            //tableName=rsmd.getTableName(i+1);
        }


// сообщаем об изменениях в структуре данных
                fireTableStructureChanged();
// получаем данные
                while (rs.next()) {
// здесь будем хранить ячейки одной строки
                    ArrayList row = new ArrayList();
                    for (int i = 0; i < columnCount; i++) {
                        if (columnTypes.get(i) == String.class){
                            row.add(rs.getString(i + 1));
                        }
                        else{
                            row.add(rs.getObject(i + 1));
                        }
                    }
                    synchronized (data) {
                        data.add(row);
// сообщаем о прибавлении строки
                        fireTableRowsInserted(data.size() - 1, data.size() - 1);
                    }
                }
            }


        }

